#include <my_header.h>
#ifndef HEAD_H
#define HEAD_H

// 进程状态
enum { BUSY, FREE };

// 记录信息，initPool()写入
typedef struct worker_status_s {
  pid_t pid;//子进程的id
  int flag;//busy or free
  int local_socket;//用于与子进程通信的socketFd

} worker_status_t;

// 初始化进程池中的进程
// 参数一：存储初始化的信息
// 参数二：初始化进程的 数量
// 返回值：-1报错
int initPool(worker_status_t *workerList, int num);

// 根据端口与ip初始化服务端socket用于监听
// 参数一：socket的fd
// 参数二：端口
// 参数三：ip
// 返回值：-1报错
int initSocket(int *socketFd, char *port, char *ip);

// epoll监听
// 参数一：epoll_fd
// 参数二：要放入监听的fd
// 返回值：-1报错
int epollAddFd(int epoll_fd, int fd);

// 子进程中，选取一个FREE进程来处理客户端的连接
// 参数一：存储初始化信息
// 参数二：池中子进程个数
// 参数三：新的socketFd，即新的客户端连接
// 返回值：-1 报错，或子进程的索引
int HandleConnect(worker_status_t *workerList, int num, int net_fd);

// 子进程的核心执行函数：一直重复recvmsg读取任务
// 参数：用来与父进程通信的本地socket fd
int doWorker(int local_socket_fd);

// 父进程给子进程发送net_fd信息
// 参数一：用来与子进程通信的本地socket fd 
// 参数二：需要通信的net_fd
int sendMesg(int local_socket_fd, int net_fd, int flag);

//子进程收取父进程发送的新socket对象
//参数一：用来与父进程通信的本地socket fd 
//参数二：accept的新socket对象
int recvMesg(int local_socket_fd,  int *net_fd, int *flag);

//与fd指定的客户端通信
int netToClient(int net_fd);

//传输文件
int sendBFile(int net_fd);
#endif // !HEAD_H
